// File: jmcomic-core/src/main/java/dev/jukomu/jmcomic/option/CacheRegistry.java
package dev.jukomu.jmcomic.option;

import dev.jukomu.common.util.Asserts;
import dev.jukomu.jmcomic.client.JmcomicClient;

import java.util.Map;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.BiFunction;

/**
 * 对应Python的CacheRegistry，用于管理客户端级别的缓存。
 * 提供不同级别的缓存策略。
 */
public class CacheRegistry {

    // 使用ConcurrentHashMap作为全局注册表，确保线程安全
    // key: JmOption实例或JmcomicClient实例
    // value: 缓存Map (key: 请求参数哈希, value: 响应结果)
    private static final Map<Object, Map<Object, Object>> REGISTRY = new ConcurrentHashMap<>();

    /**
     * 获取基于JmOption实例的缓存。
     * 所有使用相同Option实例的Client将共享此缓存。
     *
     * @param option JmOption实例
     * @param client JmcomicClient实例（未使用，仅为保持接口一致性）
     * @return 缓存Map
     */
    public static Map<Object, Object> levelOption(JmOption option, JmcomicClient client) {
        Objects.requireNonNull(option, "Option cannot be null for levelOption cache.");
        return REGISTRY.computeIfAbsent(option, k -> new ConcurrentHashMap<>());
    }

    /**
     * 获取基于JmcomicClient实例的缓存。
     * 每个Client实例拥有独立的缓存。
     *
     * @param option JmOption实例（未使用，仅为保持接口一致性）
     * @param client JmcomicClient实例
     * @return 缓存Map
     */
    public static Map<Object, Object> levelClient(JmOption option, JmcomicClient client) {
        Objects.requireNonNull(client, "Client cannot be null for levelClient cache.");
        return REGISTRY.computeIfAbsent(client, k -> new ConcurrentHashMap<>());
    }

    /**
     * 根据配置启用客户端缓存。
     *
     * @param option      JmOption实例
     * @param client      JmcomicClient实例
     * @param cacheConfig 缓存配置，可以是Boolean, String, 或 BiFunction
     */
    @SuppressWarnings("unchecked")
    public static void enableClientCacheOnCondition(JmOption option, JmcomicClient client, Object cacheConfig) {
        if (cacheConfig == null) {
            return; // 不启用缓存
        }

        BiFunction<JmOption, JmcomicClient, Map<Object, Object>> cacheProvider = null;

        if (cacheConfig instanceof Boolean) {
            if (!(Boolean) cacheConfig) {
                return; // 明确禁用缓存
            }
            cacheProvider = CacheRegistry::levelOption; // true: 使用Option级别缓存
        } else if (cacheConfig instanceof String) {
            String cacheLevel = (String) cacheConfig;
            if ("level_option".equalsIgnoreCase(cacheLevel)) {
                cacheProvider = CacheRegistry::levelOption;
            } else if ("level_client".equalsIgnoreCase(cacheLevel)) {
                cacheProvider = CacheRegistry::levelClient;
            } else {
                Asserts.requireTrue(false, "未实现的cache配置名: " + cacheLevel);
            }
        } else if (cacheConfig instanceof BiFunction) {
            // 允许传入自定义的缓存提供者
            cacheProvider = (BiFunction<JmOption, JmcomicClient, Map<Object, Object>>) cacheConfig;
        }

        if (cacheProvider != null) {
            client.setCacheMap(cacheProvider.apply(option, client));
        }
    }

    // 私有构造函数，防止实例化
    private CacheRegistry() {
    }
}